package demo04;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Collections;

/*
 *  序列化集合：
 *  案例分析：
 *      1. 将存有多个自定义对象的集合序列化操作，保存到classFile.txt文件中
 *      2. 反序列化classFile.txt，并遍历集合，打印对象信息
 */
public class Demo01ObjectStream {
    public static void main(String[] args) {
        ArrayList<Student> arrayList = new ArrayList<>();
        try (ObjectOutputStream objectOutputStream = new ObjectOutputStream( // 创建序列化流对象
                new FileOutputStream("file\\objectTxt\\classFile.txt"));
                ObjectInputStream objectInputStream = new ObjectInputStream( // 创建反序列化流对象
                        new FileInputStream("file\\objectTxt\\classFile.txt"))) {
            Student.setRoom("A班");
            Collections.addAll(arrayList, new Student("土司鸡", 18), new Student("老虎", 20), new Student("粹花", 1));
            
            // ArrayList集合类是Serializable接口的实现类，因此该类的对象可以被序列化
            objectOutputStream.writeObject(arrayList); // 写入对象
            ArrayList<Student> arrayList2 = (ArrayList<Student>) objectInputStream.readObject(); // 读取对象，强转为数组
            System.out.println(arrayList2); // [Student [age=18, name=土司鸡, room=classA], Student [age=20, name=老虎, room=classA], Student [age=1, name=粹花, room=classA]]
            System.out.println("姓名\t年龄\t班级");
            for (Student student : arrayList2) {
                System.out.println(student.getName() + "\t" + student.getAge() + "\t" + student.getRoom());
                /*
                 *  输出结果：
                 *  姓名    年龄    班级
                 *  土司鸡  18      A班
                 *  老虎    20      A班
                 *  粹花    1       A班
                 */
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
